<?php 
/**
 * Класс для работы с масивами
 *
 */

class FRM_Tools_Array
{
	/**
	 * Функция переконфертирования масива в асоциативный.
	 *
	 * @param array $array входной масив
	 * @param string $display поле-результат для асоциативного масива
	 * @param string $key поле-ключ для асоциативного масива
	 * @param string $empty тект для нулевого ключа. (для комбо например "виберите...")
	 * @return array
	 */
	static function arrayToAssoc($array, $display='l_name' ,$key='id', $empty='')
	{
		$arrReturn = array();
		if($empty){
			$arrReturn[0]=$empty;
		}

		foreach ($array as $k => $v)
		{
			if(is_array($v) && !empty($v[$key])){
				if($display && isset($v[$display])){
					$arrReturn[$v[$key]]=$v[$display];
				}else{
					$arrReturn[$v[$key]]=$v;
				}

			}else{
				$arrReturn[$k]=$v;
			}
		}

		return $arrReturn;
	}

	static function arrayExtjsFormat($array, $display='name' ,$key='id')
	{
		$arrReturn = array();

		foreach ($array as $v)
		{
			if(is_array($v) && !empty($v[$key])){
				if($display === 'l_name' && !isset($v[$display])){
					$arrReturn[]=array($v[$key], $v['name']);
				}else{
					$arrReturn[]=array($v[$key], $v[$display]);
				}

			}
		}

		return $arrReturn;
	}

	/**
	 * Функция переконфертирования многомерного асоциативного масива в одномерныйй асоциативный.
	 *
	 * @param array $array входной масив
	 * @param string $prefix префикс для ключей
	 * @return array
	 */
	static function arrayToLinearArray($array, $prefix="")
	{
		$res = array();
		foreach ($array as $k=>$v) {
			if(is_array($v)){
				$a = self::arrayToLinearArray($v, $prefix);
				$res = array_merge($res, $a);
			}else{
				$res[$prefix.$k]=$v;
			}
		}
		return $res;
	}

	static function accessArrayToLinearArray($array, $key="key", $name="name")
	{
		//print_r($array);
		$res = array();
		foreach ($array as $v) {
			if(!empty($v[$key]) && !empty($v[$name])){
				$res[$v[$key]] = $v[$name];
			}
			if(!empty($v['children']) && is_array($v['children'])){
				$a = self::accessArrayToLinearArray($v['children'], $key, $name);
				$res = array_merge($res, $a);
			}
		}
		return $res;
	}

	static function setAccessArrayFromTree($post, $array, $key="key", $l=0)
	{
		$res = array();
		foreach ($array as $v) {

			if(!empty($post[$v[$key]]) || (!empty($v['inherit']) && !empty($v['default']) )){
				if(!empty($v[$key])){
					$res[$v[$key]] = 1;
				}
				if(!empty($v['children']) && is_array($v['children'])){

					$a = self::setAccessArrayFromTree($post, $v['children'], $key, $l++);
					$res = array_merge($res, $a);
				}
			}
		}
		return $res;
	}


	static function filterAccessTree($tree, $access){
		$res = array();
		foreach ($tree as $k=>$v){
			if(!isset($v['access']) || !empty($access[$v['access']])){
				$p = $v;

				if(isset($p['children'])){
					unset($p['children']);
				}

				if(!empty($v['children']) && is_array($v['children'])){

					$a = self::filterAccessTree($v['children'], $access);
					if(!empty($a)){
						$p['children'] = $a;
					}
				}
				if (!empty($p['text']) && isset($p['sid'])){
					$p['text'] .= " <span id='span{$p['sid']}'></span>";
				}
				$res[] = $p;
			}
		}
		return $res;
	}

	static function filterInheritedAccessTree($tree){
		$res = array();
		foreach ($tree as $k=>$v){
			if(empty($v['inherit'])){
				$p = $v;
				if(isset($p['children'])){
					unset($p['children']);
				}
				if(!empty($v['children']) && is_array($v['children'])){
	
					$a = self::filterInheritedAccessTree($v['children']);
					if(!empty($a)){
						$p['children'] = $a;
					}
				}
				$res[] = $p;
			}
		}
		return $res;
	}



	static function isMultiArray($multiarray) {
		if (is_array($multiarray)) {  // confirms array
			foreach ($multiarray as $array) {  // goes one level deeper
				if (is_array($array)) {  // is subarray an array
					return true;  // return will stop function
				}  // end 2nd check
			}  // end loop
		}  // end 1st check
		return false;  // not a multiarray if this far
	}
}